package cn.ycc1.boot3schedule;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author ycc
 * @date 2023/12/8
 */
@Component
public class MyTask {
    /**
     * cron: 这是一个字符串，用于定义定时任务的执行规则。
     * 它由6个或7个字段组成，分别表示秒、分、时、日、月、周和年。
     * 每个字段之间用空格分隔。
     * *号在cron表达式中表示任意值
     * ?表示不指定值
     */
    // 每5秒执行一次
    @Scheduled(fixedRate = 5000)
    public void execute() {
//        秒（0-59）
//        分钟（0-59）
//        小时（0-23）
//        日（1-31）
//        月（1-12 或 JAN-DEC）
//        星期几（0-6 或 SUN-SAT）
//        年（可选，1970-2099）
//        其中，星期几和日两个参数只能出现一个或者同时出现。其它参数通过空格或逗号来区分，
//        用“”代表所有取值范围，用"?"代表不指定，用"/"表示间隔时间。

//        举例与特殊符号详解
//        举例：
//        "0 0 8 * * *" 表示每天上午8点执行任务。
//        "0 0/30 9-17 * * *" 表示在每天9点到17点之间，每隔30分钟执行一次任务。
//        "0 0 12 ? * WED" 表示每周三中午12点执行任务。
//        "0 0 10 L * ?" 表示每个月的最后一天上午10点执行任务。
//        "0 0 3-5 * * *" 表示每天凌晨3点到5点之间，每小时执行一次任务。
//        "0 15 10 L * ?" 表示每个月的最后一天上午10:15分执行任务。

//        特殊符号：
//      *（通配符）：匹配任意值，例如* * * * * ?表示每秒执行一次任务。
//      ,（列表）：用于指定多个取值，例如0 0 6,12,18 * * ?表示每天6点、12点和18点执行任务。
//        -（范围）：用于指定一个范围内的取值，例如0 0 9-17 * * MON-FRI表示周一至周五的9点到17点之间每小时执行一次任务。
//      /（步长）：用于指定一个取值的步长，例如0 */30 * * * ?表示每30分钟执行一次任务。
//      ?（无意义占位符）：用于指定一个字段没有具体的取值，只能与其他字段一起使用，例如0 0 12 ? * MON-FRI表示周一至周五中午12点执行任务。
//      #（日历偏移量）：用于指定某个月份的第几个周几，例如0 0 0 ? * 3#1表示每个月的第一个星期三执行任务。
//        L（Last）：表示某个指定时间内的最后一天，比如0 0 L * * ?表示每月的最后一天执行任务。
//        W（Weekday）：表示距离指定日期最近的工作日，比如0 0 0 15W * ?表示当月第15个工作日执行任务。如果15号是工作日，则执行任务；如果15号是周末，则任务会提前到最近的工作日即14号执行。
//        C（Calendar）：表示距离指定日期最近的那个日子，比如0 0 0 1W * ?表示当月的第一个工作日执行任务。如果1号是工作日，则执行任务；如果1号是周末，则任务会延后到最近的工作日即2号执行。

//      星号 *：表示“从头到尾（frist-last）”。比如 [minte] 取值 * 时，等同于 0-59，表示每分钟执行一次

//        0 0 2 1 * ? * 表示在每月的1日的凌晨2点调度任务
//        0 0 2 1 * ?  表示在每月的1日的凌晨2点调度任务
// https://tool.4xseo.com/a/810.html
        System.out.println("定时任务执行：" + new Date());
    }

//    springboot的定时任务与Quartz有什么异同？
//    Spring Boot的定时任务和Quartz都可以实现定时任务的功能，但二者在实现方式和使用上存在一些异同。
//
//    首先，Spring Boot的定时任务有两种实现方式：一种是使用内置的@Scheduled注解，另一种是整合Quartz框架。而Quartz是一个成熟的定时任务框架，功能强大但配置略微复杂。当Spring Boot整合了Quartz后，其配置过程得到了简化，很多配置采用了默认设置，使得开发阶段更为便捷。
//
//    另外，不同于Spring Boot定时任务的内存方式存储任务信息，Quartz提供了更多的存储方式，包括默认的内存方式、数据库方式以及分布式任务支持。特别是对于分布式任务的支持，多个分布点上的Quartz任务是通过数据库实现任务信息传递的，确保一个时间点上只有一个分布环境执行定时任务。
//
//    综上，Spring Boot的定时任务实现起来相对简单快捷，适用于简单的定时任务处理；而Quartz则更适合于复杂的定时任务场景，如需要处理大量Jobs或者需要分布式调度的情况。

}
